{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Logistic 回归——prima Indians Diabetes Data Set"
   ]
  },
  {
   "cell_type": "raw",
   "metadata": {},
   "source": [
    "数据说明：\n",
    "任务目标：prima Indians Diabetes Data Set（印第安人糖尿病数据集）根据现有的医疗信息预测5年内印第安人糖尿病发病的概率\n",
    "数据集共有9个字段：\n",
    "（9个字段中，其中8个对应不同的特征值，1个位标签值。）\n",
    "0列为pregnants(怀孕次数)；\n",
    "1列为Plasma_glucose_concentration(口服葡萄糖耐量试验中2小时后的血浆葡萄糖浓度)；\n",
    "2列为blood_pressure(舒张压,单位:mm Hg）\n",
    "3列为Triceps_skin_fold_thickness(三头肌皮褶厚度,单位：mm） \n",
    "4列为serum_insulin(餐后血清胰岛素,单位:mm）\n",
    "5列为BMI,体重指数（体重（公斤）/ 身高（米）^2）\n",
    "6列为Diabetes_pedigree_function(糖尿病家系作用)\n",
    "7列为Age(年龄)\n",
    "8列为Target(分类变量,0或1）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [],
   "source": [
    "#首先 import 必要的模块\n",
    "import numpy as np # linear algebra\n",
    "import pandas as pd # data processing, CSV file I/O\n",
    "\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "\n",
    "#评价指标为logloss（对数损失）\n",
    "from sklearn.metrics import log_loss\n",
    "\n",
    "from matplotlib import pyplot \n",
    "import seaborn as sns #前面两个是数据模块，后面两个是绘图模块\n",
    "#color = sns.color_palette()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 读取数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>pregnants</th>\n",
       "      <th>Plasma_glucose_concentration</th>\n",
       "      <th>blood_pressure</th>\n",
       "      <th>Triceps_skin_fold_thickness</th>\n",
       "      <th>serum_insulin</th>\n",
       "      <th>BMI</th>\n",
       "      <th>Diabetes_pedigree_function</th>\n",
       "      <th>Age</th>\n",
       "      <th>Target</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.639947</td>\n",
       "      <td>0.866045</td>\n",
       "      <td>-0.031990</td>\n",
       "      <td>0.670643</td>\n",
       "      <td>-0.181541</td>\n",
       "      <td>0.166619</td>\n",
       "      <td>0.468492</td>\n",
       "      <td>1.425995</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-0.844885</td>\n",
       "      <td>-1.205066</td>\n",
       "      <td>-0.528319</td>\n",
       "      <td>-0.012301</td>\n",
       "      <td>-0.181541</td>\n",
       "      <td>-0.852200</td>\n",
       "      <td>-0.365061</td>\n",
       "      <td>-0.190672</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1.233880</td>\n",
       "      <td>2.016662</td>\n",
       "      <td>-0.693761</td>\n",
       "      <td>-0.012301</td>\n",
       "      <td>-0.181541</td>\n",
       "      <td>-1.332500</td>\n",
       "      <td>0.604397</td>\n",
       "      <td>-0.105584</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>-0.844885</td>\n",
       "      <td>-1.073567</td>\n",
       "      <td>-0.528319</td>\n",
       "      <td>-0.695245</td>\n",
       "      <td>-0.540642</td>\n",
       "      <td>-0.633881</td>\n",
       "      <td>-0.920763</td>\n",
       "      <td>-1.041549</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>-1.141852</td>\n",
       "      <td>0.504422</td>\n",
       "      <td>-2.679076</td>\n",
       "      <td>0.670643</td>\n",
       "      <td>0.316566</td>\n",
       "      <td>1.549303</td>\n",
       "      <td>5.484909</td>\n",
       "      <td>-0.020496</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   pregnants  Plasma_glucose_concentration  blood_pressure  \\\n",
       "0   0.639947                      0.866045       -0.031990   \n",
       "1  -0.844885                     -1.205066       -0.528319   \n",
       "2   1.233880                      2.016662       -0.693761   \n",
       "3  -0.844885                     -1.073567       -0.528319   \n",
       "4  -1.141852                      0.504422       -2.679076   \n",
       "\n",
       "   Triceps_skin_fold_thickness  serum_insulin       BMI  \\\n",
       "0                     0.670643      -0.181541  0.166619   \n",
       "1                    -0.012301      -0.181541 -0.852200   \n",
       "2                    -0.012301      -0.181541 -1.332500   \n",
       "3                    -0.695245      -0.540642 -0.633881   \n",
       "4                     0.670643       0.316566  1.549303   \n",
       "\n",
       "   Diabetes_pedigree_function       Age  Target  \n",
       "0                    0.468492  1.425995       1  \n",
       "1                   -0.365061 -0.190672       0  \n",
       "2                    0.604397 -0.105584       1  \n",
       "3                   -0.920763 -1.041549       0  \n",
       "4                    5.484909 -0.020496       1  "
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#input data\n",
    "train = pd.read_csv(\"FE_pima-indians-diabetes.csv\")\n",
    "train.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 768 entries, 0 to 767\n",
      "Data columns (total 9 columns):\n",
      "pregnants                       768 non-null float64\n",
      "Plasma_glucose_concentration    768 non-null float64\n",
      "blood_pressure                  768 non-null float64\n",
      "Triceps_skin_fold_thickness     768 non-null float64\n",
      "serum_insulin                   768 non-null float64\n",
      "BMI                             768 non-null float64\n",
      "Diabetes_pedigree_function      768 non-null float64\n",
      "Age                             768 non-null float64\n",
      "Target                          768 non-null int64\n",
      "dtypes: float64(8), int64(1)\n",
      "memory usage: 54.1 KB\n"
     ]
    }
   ],
   "source": [
    "train.info()#得到样本数据信息"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "# get labels,将样本特征和标签值分开\n",
    "y_train = train['Target']\n",
    "x_train = train.drop([\"Target\"],axis = 1)\n",
    "#用于特征重要性可视化\n",
    "feat_names = x_train.columns"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 模型训练"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# default logistic Regression"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.linear_model import LogisticRegression\n",
    "lr = LogisticRegression() #实例化模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "logloss of each fold is: [0.48797856 0.53011593 0.4562292  0.422546   0.48392885]\n",
      "cv logloss is: 0.47615970944434044\n"
     ]
    }
   ],
   "source": [
    "#交叉验证用于评估模型性能和进行参数调优（模型选择）\n",
    "#分类任务中交叉验证缺省是采用StratifieldKFold\n",
    "from sklearn.model_selection import cross_val_score\n",
    "loss = cross_val_score(lr,x_train,y_train,cv = 5,scoring = 'neg_log_loss')\n",
    "print('logloss of each fold is:',-loss)\n",
    "print('cv logloss is:', -loss.mean()) "
   ]
  },
  {
   "cell_type": "raw",
   "metadata": {},
   "source": [
    "每一折计算得到的误差差异很大，原因是样本数据量太小，导致统计性差异很大"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 正则化的Logistic Regression及参数调优"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "这部分用交叉验证GridSearchCV、LogisticRegressionCV任意一种方式均可\n",
    "\n",
    "logistic回归的需要调整超参数有：C（正则系数，一般在log域（取log后的值）均匀设置候选参数）和正则函数\n",
    "penalty(L1/L2)目标函数为：J = C* sum(logloss(f(xi),yi)) + penalty\n",
    "\n",
    "在sklearn框架下，不同学习器的参数调整步骤相同：\n",
    "设置候选参数集合\n",
    "生成一个GridSearchCV的实例\n",
    "调用GridSearchCV的fit函数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fitting 5 folds for each of 14 candidates, totalling 70 fits\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=4)]: Done  10 tasks      | elapsed:    2.3s\n",
      "[Parallel(n_jobs=4)]: Done  70 out of  70 | elapsed:    2.5s finished\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv=5, error_score='raise',\n",
       "       estimator=LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n",
       "          intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,\n",
       "          penalty='l2', random_state=None, solver='liblinear', tol=0.0001,\n",
       "          verbose=0, warm_start=False),\n",
       "       fit_params=None, iid=True, n_jobs=4,\n",
       "       param_grid={'penalty': ['l1', 'l2'], 'C': [0.001, 0.01, 0.1, 1, 10, 100, 1000]},\n",
       "       pre_dispatch='2*n_jobs', refit=True, return_train_score='warn',\n",
       "       scoring='neg_log_loss', verbose=5)"
      ]
     },
     "execution_count": 51,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "#需要调优的参数\n",
    "#尝试将L1正则和L2正则分开，并配合合适的优化求解算法（slover）\n",
    "penaltys = ['l1','l2']\n",
    "Cs = [0.001,0.01,0.1,1,10,100,1000]\n",
    "tuned_parameters = dict(penalty = penaltys,C = Cs)#组成字典形式\n",
    "\n",
    "lr_penalty = LogisticRegression()\n",
    "grid = GridSearchCV(lr_penalty,tuned_parameters,cv = 5,scoring = 'neg_log_loss',n_jobs = 4,verbose = 5)#,n_jobs：多少核处理 verbose：是否打印信息\n",
    "grid.fit(x_train,y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.47602508949768074\n",
      "{'C': 1, 'penalty': 'l1'}\n"
     ]
    }
   ],
   "source": [
    "#examine the best model\n",
    "print(-grid.best_score_)\n",
    "print(grid.best_params_)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 比默认参数稍好一点，默认参数为0.4761.对应的penalty为L2，c = 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\dell\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('mean_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\Users\\dell\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('std_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# plot cv误差曲线\n",
    "test_means = -grid.cv_results_['mean_test_score']\n",
    "test_stds = grid.cv_results_['std_test_score']\n",
    "train_means = -grid.cv_results_['mean_train_score']\n",
    "train_stds = grid.cv_results_['std_train_score']\n",
    "\n",
    "#plot results\n",
    "n_Cs = len(Cs)\n",
    "number_penaltys = len(penaltys)\n",
    "test_scores = np.array(test_means).reshape(n_Cs,number_penaltys)\n",
    "train_scores = np.array(train_means).reshape(n_Cs,number_penaltys)\n",
    "test_stds = np.array(test_stds).reshape(n_Cs,number_penaltys)\n",
    "train_stds = np.array(train_stds).reshape(n_Cs,number_penaltys)\n",
    "\n",
    "x_axis = np.log10(Cs)\n",
    "for i,value in enumerate(penaltys):\n",
    "    pyplot.errorbar(x_axis,test_scores[:,i],yerr = test_stds[:,i],label = penaltys[i] + 'Test')\n",
    "    pyplot.errorbar(x_axis,train_scores[:,i],yerr = test_stds[:,i],label = penaltys[i] + 'Train')\n",
    "pyplot.legend()\n",
    "pyplot.xlabel('log(C)')\n",
    "pyplot.ylabel('logloss')\n",
    "pyplot.savefig('LogisticGridSearchCV_c.png')\n",
    "\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "上图给出了L1正则和L2正则下，不同正则参数c对应的模型在训练集上，测试集上的正确率（score）。可以看出在训练集上c越大（正则越小）的模型性能越好；但是在测试集上当c = 1时性能最好（L1正则）"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 换正确率做评价指标"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.7747395833333334\n",
      "{'C': 0.1, 'penalty': 'l2'}\n"
     ]
    }
   ],
   "source": [
    "penaltys = ['l1','l2']\n",
    "Cs = [0.001,0.01,0.1,1,10,100,1000]\n",
    "tuned_parameters = dict(penalty = penaltys,C = Cs)#组成字典形式\n",
    "\n",
    "lr_penalty = LogisticRegression()#选择的分类器\n",
    "\n",
    "#缺省scoring为正确率\n",
    "grid = GridSearchCV(lr_penalty,tuned_parameters,cv = 5)#对于分类器，默认的评价指标就是正确率\n",
    "grid.fit(x_train,y_train)\n",
    "\n",
    "#examine the best model\n",
    "print(grid.best_score_)\n",
    "print(grid.best_params_)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "选用不同的评价指标，对应的最佳参数和正则方法也不一样"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\dell\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('mean_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\Users\\dell\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('std_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# plot cv误差曲线\n",
    "test_means = grid.cv_results_['mean_test_score']\n",
    "test_stds = grid.cv_results_['std_test_score']\n",
    "train_means = grid.cv_results_['mean_train_score']\n",
    "train_stds = grid.cv_results_['std_train_score']\n",
    "\n",
    "#plot results\n",
    "n_Cs = len(Cs)\n",
    "number_penaltys = len(penaltys)\n",
    "test_scores = np.array(test_means).reshape(n_Cs,number_penaltys)\n",
    "train_scores = np.array(train_means).reshape(n_Cs,number_penaltys)\n",
    "test_stds = np.array(test_stds).reshape(n_Cs,number_penaltys)\n",
    "train_stds = np.array(train_stds).reshape(n_Cs,number_penaltys)\n",
    "\n",
    "x_axis = np.log10(Cs)\n",
    "for i,value in enumerate(penaltys):\n",
    "    pyplot.errorbar(x_axis,test_scores[:,i],yerr = test_stds[:,i],label = penaltys[i] + 'Test')\n",
    "   # pyplot.errorbar(x_axis,train_scores[:,i],yerr = test_stds[:,i],label = penaltys[i] + 'Train')\n",
    "pyplot.legend()\n",
    "pyplot.xlabel('log(C)')\n",
    "pyplot.ylabel('logloss')\n",
    "pyplot.savefig('LogisticGridSearchCV_cs.png')\n",
    "\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "l2\n",
      "0.1\n"
     ]
    }
   ],
   "source": [
    "print(grid.best_params_['penalty'])\n",
    "print(grid.best_params_['C'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0.36167135,  0.99773092, -0.0648661 ,  0.05966521, -0.04513553,\n",
       "         0.54600449,  0.25990383,  0.15544357]])"
      ]
     },
     "execution_count": 61,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "grid.best_estimator_.coef_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>columns</th>\n",
       "      <th>coeffient</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Plasma_glucose_concentration</td>\n",
       "      <td>[0.9977309169127753]</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>BMI</td>\n",
       "      <td>[0.5460044910698728]</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>pregnants</td>\n",
       "      <td>[0.3616713513905088]</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>Diabetes_pedigree_function</td>\n",
       "      <td>[0.2599038326076921]</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>Age</td>\n",
       "      <td>[0.1554435734114967]</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Triceps_skin_fold_thickness</td>\n",
       "      <td>[0.05966520979020303]</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>serum_insulin</td>\n",
       "      <td>[-0.04513553103768548]</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>blood_pressure</td>\n",
       "      <td>[-0.0648660966137046]</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                        columns               coeffient\n",
       "1  Plasma_glucose_concentration    [0.9977309169127753]\n",
       "5                           BMI    [0.5460044910698728]\n",
       "0                     pregnants    [0.3616713513905088]\n",
       "6    Diabetes_pedigree_function    [0.2599038326076921]\n",
       "7                           Age    [0.1554435734114967]\n",
       "3   Triceps_skin_fold_thickness   [0.05966520979020303]\n",
       "4                 serum_insulin  [-0.04513553103768548]\n",
       "2                blood_pressure   [-0.0648660966137046]"
      ]
     },
     "execution_count": 62,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df = pd.DataFrame({'columns':list(feat_names),\"coeffient\":list(grid.best_estimator_.coef_.T)})\n",
    "df.sort_values(by = ['coeffient'],ascending = False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
